home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / os2 / octa209s.zip / octave-2.09 / libcruft / minpack / qrfac.f < prev    next >
Text File  |  1996-07-19  |  5KB  |  165 lines

  1.       SUBROUTINE QRFAC(M,N,A,LDA,PIVOT,IPVT,LIPVT,SIGMA,ACNORM,WA)
  2.       INTEGER M,N,LDA,LIPVT
  3.       INTEGER IPVT(LIPVT)
  4.       LOGICAL PIVOT
  5.       DOUBLE PRECISION A(LDA,N),SIGMA(N),ACNORM(N),WA(N)
  6. C     **********
  7. C
  8. C     SUBROUTINE QRFAC
  9. C
  10. C     THIS SUBROUTINE USES HOUSEHOLDER TRANSFORMATIONS WITH COLUMN
  11. C     PIVOTING (OPTIONAL) TO COMPUTE A QR FACTORIZATION OF THE
  12. C     M BY N MATRIX A. THAT IS, QRFAC DETERMINES AN ORTHOGONAL
  13. C     MATRIX Q, A PERMUTATION MATRIX P, AND AN UPPER TRAPEZOIDAL
  14. C     MATRIX R WITH DIAGONAL ELEMENTS OF NONINCREASING MAGNITUDE,
  15. C     SUCH THAT A*P = Q*R. THE HOUSEHOLDER TRANSFORMATION FOR
  16. C     COLUMN K, K = 1,2,...,MIN(M,N), IS OF THE FORM
  17. C
  18. C                           T
  19. C           I - (1/U(K))*U*U
  20. C
  21. C     WHERE U HAS ZEROS IN THE FIRST K-1 POSITIONS. THE FORM OF
  22. C     THIS TRANSFORMATION AND THE METHOD OF PIVOTING FIRST
  23. C     APPEARED IN THE CORRESPONDING LINPACK SUBROUTINE.
  24. C
  25. C     THE SUBROUTINE STATEMENT IS
  26. C
  27. C       SUBROUTINE QRFAC(M,N,A,LDA,PIVOT,IPVT,LIPVT,SIGMA,ACNORM,WA)
  28. C
  29. C     WHERE
  30. C
  31. C       M IS A POSITIVE INTEGER INPUT VARIABLE SET TO THE NUMBER
  32. C         OF ROWS OF A.
  33. C
  34. C       N IS A POSITIVE INTEGER INPUT VARIABLE SET TO THE NUMBER
  35. C         OF COLUMNS OF A.
  36. C
  37. C       A IS AN M BY N ARRAY. ON INPUT A CONTAINS THE MATRIX FOR
  38. C         WHICH THE QR FACTORIZATION IS TO BE COMPUTED. ON OUTPUT
  39. C         THE STRICT UPPER TRAPEZOIDAL PART OF A CONTAINS THE STRICT
  40. C         UPPER TRAPEZOIDAL PART OF R, AND THE LOWER TRAPEZOIDAL
  41. C         PART OF A CONTAINS A FACTORED FORM OF Q (THE NON-TRIVIAL
  42. C         ELEMENTS OF THE U VECTORS DESCRIBED ABOVE).
  43. C
  44. C       LDA IS A POSITIVE INTEGER INPUT VARIABLE NOT LESS THAN M
  45. C         WHICH SPECIFIES THE LEADING DIMENSION OF THE ARRAY A.
  46. C
  47. C       PIVOT IS A LOGICAL INPUT VARIABLE. IF PIVOT IS SET TRUE,
  48. C         THEN COLUMN PIVOTING IS ENFORCED. IF PIVOT IS SET FALSE,
  49. C         THEN NO COLUMN PIVOTING IS DONE.
  50. C
  51. C       IPVT IS AN INTEGER OUTPUT ARRAY OF LENGTH LIPVT. IPVT
  52. C         DEFINES THE PERMUTATION MATRIX P SUCH THAT A*P = Q*R.
  53. C         COLUMN J OF P IS COLUMN IPVT(J) OF THE IDENTITY MATRIX.
  54. C         IF PIVOT IS FALSE, IPVT IS NOT REFERENCED.
  55. C
  56. C       LIPVT IS A POSITIVE INTEGER INPUT VARIABLE. IF PIVOT IS FALSE,
  57. C         THEN LIPVT MAY BE AS SMALL AS 1. IF PIVOT IS TRUE, THEN
  58. C         LIPVT MUST BE AT LEAST N.
  59. C
  60. C       SIGMA IS AN OUTPUT ARRAY OF LENGTH N WHICH CONTAINS THE
  61. C         DIAGONAL ELEMENTS OF R.
  62. C
  63. C       ACNORM IS AN OUTPUT ARRAY OF LENGTH N WHICH CONTAINS THE
  64. C         NORMS OF THE CORRESPONDING COLUMNS OF THE INPUT MATRIX A.
  65. C         IF THIS INFORMATION IS NOT NEEDED, THEN ACNORM CAN COINCIDE
  66. C         WITH SIGMA.
  67. C
  68. C       WA IS A WORK ARRAY OF LENGTH N. IF PIVOT IS FALSE, THEN WA
  69. C         CAN COINCIDE WITH SIGMA.
  70. C
  71. C     SUBPROGRAMS CALLED
  72. C
  73. C       MINPACK-SUPPLIED ... DPMPAR,ENORM
  74. C
  75. C       FORTRAN-SUPPLIED ... DMAX1,DSQRT,MIN0
  76. C
  77. C     MINPACK. VERSION OF DECEMBER 1978.
  78. C     BURTON S. GARBOW, KENNETH E. HILLSTROM, JORGE J. MORE
  79. C
  80. C     **********
  81.       INTEGER I,J,JP1,K,KMAX,MINMN
  82.       DOUBLE PRECISION AJNORM,EPSMCH,ONE,P05,SUM,TEMP,ZERO
  83.       DOUBLE PRECISION DPMPAR,ENORM
  84.       DATA ONE,P05,ZERO /1.0D0,5.0D-2,0.0D0/
  85. C
  86. C     EPSMCH IS THE MACHINE PRECISION.
  87. C
  88.       EPSMCH = DPMPAR(1)
  89. C
  90. C     COMPUTE THE INITIAL COLUMN NORMS AND INITIALIZE SEVERAL ARRAYS.
  91. C
  92.       DO 10 J = 1, N
  93.          ACNORM(J) = ENORM(M,A(1,J))
  94.          SIGMA(J) = ACNORM(J)
  95.          WA(J) = SIGMA(J)
  96.          IF (PIVOT) IPVT(J) = J
  97.    10    CONTINUE
  98. C
  99. C     REDUCE A TO R WITH HOUSEHOLDER TRANSFORMATIONS.
  100. C
  101.       MINMN = MIN0(M,N)
  102.       DO 110 J = 1, MINMN
  103.          IF (.NOT.PIVOT) GO TO 40
  104. C
  105. C        BRING THE COLUMN OF LARGEST NORM INTO THE PIVOT POSITION.
  106. C
  107.          KMAX = J
  108.          DO 20 K = J, N
  109.             IF (SIGMA(K) .GT. SIGMA(KMAX)) KMAX = K
  110.    20       CONTINUE
  111.          IF (KMAX .EQ. J) GO TO 40
  112.          DO 30 I = 1, M
  113.             TEMP = A(I,J)
  114.             A(I,J) = A(I,KMAX)
  115.             A(I,KMAX) = TEMP
  116.    30       CONTINUE
  117.          SIGMA(KMAX) = SIGMA(J)
  118.          WA(KMAX) = WA(J)
  119.          K = IPVT(J)
  120.          IPVT(J) = IPVT(KMAX)
  121.          IPVT(KMAX) = K
  122.    40    CONTINUE
  123. C
  124. C        COMPUTE THE HOUSEHOLDER TRANSFORMATION TO REDUCE THE
  125. C        J-TH COLUMN OF A TO A MULTIPLE OF THE J-TH UNIT VECTOR.
  126. C
  127.          AJNORM = ENORM(M-J+1,A(J,J))
  128.          IF (AJNORM .EQ. ZERO) GO TO 100
  129.          IF (A(J,J) .LT. ZERO) AJNORM = -AJNORM
  130.          DO 50 I = J, M
  131.             A(I,J) = A(I,J)/AJNORM
  132.    50       CONTINUE
  133.          A(J,J) = A(J,J) + ONE
  134. C
  135. C        APPLY THE TRANSFORMATION TO THE REMAINING COLUMNS
  136. C        AND UPDATE THE NORMS.
  137. C
  138.          JP1 = J + 1
  139.          IF (N .LT. JP1) GO TO 100
  140.          DO 90 K = JP1, N
  141.             SUM = ZERO
  142.             DO 60 I = J, M
  143.                SUM = SUM + A(I,J)*A(I,K)
  144.    60          CONTINUE
  145.             TEMP = SUM/A(J,J)
  146.             DO 70 I = J, M
  147.                A(I,K) = A(I,K) - TEMP*A(I,J)
  148.    70          CONTINUE
  149.             IF (.NOT.PIVOT .OR. SIGMA(K) .EQ. ZERO) GO TO 80
  150.             TEMP = A(J,K)/SIGMA(K)
  151.             SIGMA(K) = SIGMA(K)*DSQRT(DMAX1(ZERO,ONE-TEMP**2))
  152.             IF (P05*(SIGMA(K)/WA(K))**2 .GT. EPSMCH) GO TO 80
  153.             SIGMA(K) = ENORM(M-J,A(JP1,K))
  154.             WA(K) = SIGMA(K)
  155.    80       CONTINUE
  156.    90       CONTINUE
  157.   100    CONTINUE
  158.          SIGMA(J) = -AJNORM
  159.   110    CONTINUE
  160.       RETURN
  161. C
  162. C     LAST CARD OF SUBROUTINE QRFAC.
  163. C
  164.       END
  165.